package com.xzcedu.homework;

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * @author 徐州城
 * @version 1.0
 * TCP服务端
 * 先写文件下载的服务端
 */
public class Homework03Server {
    public static void main(String[] args) throws Exception {

        //1. 监听 9999端口，等待客户端连接
        ServerSocket serverSocket = new ServerSocket(9999);
        //2. 等待客户端连接
        System.out.println("服务端 9999端口 等待连接...");
        Socket socket = serverSocket.accept();
        //3. 读取客户端发送的 要下载的文件名
        //   使用了while循环读取文件，是考虑将来客户端发送的数据较大的情况
        InputStream inputStream = socket.getInputStream();
        byte[] b = new byte[1024];
        int len = 0;
        String downLoadFileName = "";
        while ((len = inputStream.read(b)) != -1) {
            downLoadFileName += new String(b, 0, len);
        }
        System.out.println("客户端希望下载的文件名=" + downLoadFileName);

        //在服务器 有两个文件，无名.mp3     高山流水.mp3
        //如果客户端下载的是 高山流水 我们就返回，否则就一律返回 无名
        String resFileName = "";

        if ("高山流水".equals(downLoadFileName)) {
            resFileName = "src\\高山流水.mp3";
        } else
            resFileName = "src\\无名.mp3";

        //4. 创建一个输入流，读取文件
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(resFileName));

        //5. 使用工具类 StreamUtils，读取文件到一个字节数组
        byte[] data = StreamUtils.streamToByteArray(bis);
        //6. 得到Socket关联的输出流
        BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
        //写入数据通道，返回给客户端
        bos.write(data);
        socket.shutdownOutput();//结束标记

        //8. 关闭流
        inputStream.close();
        bis.close();
        bos.close();
        socket.close();
        serverSocket.close();
        System.out.println("服务端退出..");
    }
}
